package com.eian.boot.common.id.enums;

import lombok.Getter;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * ID模板类型枚举（前缀/后缀动态内容）
 *
 * @author alex.meng
 */
@Getter
public enum IdTemplateType {
    /**
     * 固定值（使用配置的固定字符串）
     */
    FIXED("FIXED", "固定值"),

    /**
     * 年份（4位）
     * 示例：2025
     */
    YEAR("YEAR", "年份(YYYY)"),

    /**
     * 年月（6位）
     * 示例：202510
     */
    YEAR_MONTH("YEAR_MONTH", "年月(YYYYMM)"),

    /**
     * 年月日（8位）
     * 示例：20251015
     */
    YEAR_MONTH_DAY("YEAR_MONTH_DAY", "年月日(YYYYMMDD)"),

    /**
     * 年月日时（10位）
     * 示例：2025101514
     */
    YEAR_MONTH_DAY_HOUR("YEAR_MONTH_DAY_HOUR", "年月日时(YYYYMMDDHH)"),

    /**
     * 年月日时分（12位）
     * 示例：202510151430
     */
    YEAR_MONTH_DAY_HOUR_MINUTE("YEAR_MONTH_DAY_HOUR_MINUTE", "年月日时分(YYYYMMDDHHMM)"),

    /**
     * 月日（4位）
     * 示例：1015
     */
    MONTH_DAY("MONTH_DAY", "月日(MMDD)"),

    /**
     * 时间戳（秒）
     * 示例：1697356800
     */
    TIMESTAMP_SECOND("TIMESTAMP_SECOND", "时间戳(秒)"),

    /**
     * 时间戳（毫秒）
     * 示例：1697356800000
     */
    TIMESTAMP_MILLIS("TIMESTAMP_MILLIS", "时间戳(毫秒)");

    private final String code;
    private final String description;

    IdTemplateType(String code, String description) {
        this.code = code;
        this.description = description;
    }

    /**
     * 根据code获取枚举
     *
     * @param code 编码
     * @return 枚举值
     */
    public static IdTemplateType fromCode(String code) {
        if (code == null || code.isEmpty()) {
            return FIXED;
        }
        for (IdTemplateType type : values()) {
            if (type.code.equals(code)) {
                return type;
            }
        }
        return FIXED;
    }

    /**
     * 根据模板类型生成实际值
     *
     * @return 生成的值
     */
    public String generate() {
        LocalDateTime now = LocalDateTime.now();
        return switch (this) {
            case FIXED -> "";
            case YEAR -> now.format(DateTimeFormatter.ofPattern("yyyy"));
            case YEAR_MONTH -> now.format(DateTimeFormatter.ofPattern("yyyyMM"));
            case YEAR_MONTH_DAY -> now.format(DateTimeFormatter.ofPattern("yyyyMMdd"));
            case YEAR_MONTH_DAY_HOUR -> now.format(DateTimeFormatter.ofPattern("yyyyMMddHH"));
            case YEAR_MONTH_DAY_HOUR_MINUTE -> now.format(DateTimeFormatter.ofPattern("yyyyMMddHHmm"));
            case MONTH_DAY -> now.format(DateTimeFormatter.ofPattern("MMdd"));
            case TIMESTAMP_SECOND -> String.valueOf(System.currentTimeMillis() / 1000);
            case TIMESTAMP_MILLIS -> String.valueOf(System.currentTimeMillis());
        };
    }
}

